from fastapi import FastAPI, Request, Form
import uvicorn
#页面重定向跳转
from fastapi.responses import RedirectResponse
from fastapi.templating import Jinja2Templates

from tortoise.contrib.fastapi import register_tortoise

from config.models import Users


#定义模版文件的存储路径
template = Jinja2Templates("templates")

app = FastAPI()

register_tortoise(app,
                  db_url="sqlite://db.sqlite3",
                  # db_url="mysql://root:123456@localhost:3306/dbnames",
                  modules={"modules": ["config.models"]},
                  generate_schemas=True,
                  add_exception_handlers=True,)


# username 是URL传递过来的参数值  在模版中用name 去展示出来
@app.get("/")
async def index(itme: Request):
    user_list = await Users.all()
    print(user_list)
    return template.TemplateResponse("index.html", context={"request": itme, "users": user_list})


@app.post("/users")
# 如果必须要获取值的情况下。需要改成From(...)，在括号内加... 三个点, 或者加判断
async def users(username=Form(None), name=Form(None), family_name=Form(None), category=Form(None), password_hash=Form(None)):
    if not username:
        return RedirectResponse("/", status_code=302)
    #创建一个变量，把orm模型获取的数据灌输到模型中并且赋值给变量中
    user = Users(
        username=username,
        name=name,
        family_name=family_name,
        category=category,
        password_hash=password_hash
    )
    print(user)
    # 保存
    await user.save()
    """ user 的属于post请求过来的 如果重定向到 index里面 那么是由 post 跳转到 get 方法中这里是不允许的，
    默认post 状态码属于307，而get的状态码属于 302 
    如果想互通需要修改 状态码来解决这个问题，那么就需要加上 status_code=302 来解决问题。"""
    return RedirectResponse("/", status_code=302)


#关于搜索
@app.post("/search")
async def search(itme: Request, kw=Form(None)):
    search_results = await Users.filter(username__icontains=kw).all()
    search_count = await Users.filter(username__icontains=kw).count()
    # 下面的事全匹配
    # search_results = await Users.filter(username__contains=kw).all()
    print(search_results)
    return template.TemplateResponse("search.html", context={"request": itme, "users": search_results, "count": search_count})



if __name__ == "__main__":
    uvicorn.run(app='main:app', host='127.0.0.1', port=9000, reload=True, workers=1)